﻿#pragma once
#include "yzrutil.h"
#include "io/File.h"
#include "lang/String.h"
#include "array/Array.hpp"
#include <optional>

namespace yzrilyzr_util{
	EBCLASS(FileUtil){
	private:
	static constexpr const char * seperateChar="/";
	static constexpr const char * doubleSeperateChar="//";
	static constexpr const char * currentDir="/./";
	static constexpr const int unitCount=9;
	static constexpr const char * FileSizeBiByteUnit[unitCount]={
		"B",
		"kiB",
		"MiB",
		"GiB",
		"TiB",
		"PiB",
		"EiB",
		"ZiB",
		"YiB"
	};
	static constexpr const char * FileSizeByteUnit[unitCount]={"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
	public:
	static yzrilyzr_io::File nextName(const yzrilyzr_lang::String & file);
	static yzrilyzr_io::File nextName(const yzrilyzr_io::File & file);
	static int64_t getFileSize(const yzrilyzr_io::File & path);
	static int64_t getFileSize(const yzrilyzr_lang::String & path);
	static yzrilyzr_lang::String readFileString(const yzrilyzr_lang::String & path);
	static yzrilyzr_array::ByteArray readFileByte(const yzrilyzr_lang::String & path);
	static yzrilyzr_lang::String getFileExtension(const yzrilyzr_lang::String & name);
	static bool isGIF(const yzrilyzr_array::ByteArray & headerBytes);
	static yzrilyzr_lang::String getFileSizeBinStr(double size);
	static yzrilyzr_lang::String getFileSizeDecStr(double size);
	static yzrilyzr_lang::String abs(const yzrilyzr_lang::String & p);
	static yzrilyzr_lang::String normalize(const yzrilyzr_lang::String & p);
	static yzrilyzr_lang::String parent(const yzrilyzr_lang::String & p);
	static yzrilyzr_lang::String name(const yzrilyzr_lang::String & p);
	static void mkdirs(const yzrilyzr_lang::String & path);
	static void mkdirs(const yzrilyzr_io::File & f);
	};
}